import { defineStore } from 'pinia';
import { ref, computed, watch } from 'vue';
import http from '../utils/request';
import TokenManager from '../utils/tokenManager';
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper';

/**
 * 认证中心Store
 */
export const useAuthStore = defineStore('auth', () => {
  // 用户信息
  const userProfile = ref<any>(null);
  
  // 权限数据（响应式，用于触发更新）
  const permissionsRef = ref<string[]>([]);
  
  // 从 localStorage 读取权限的辅助函数
  const readPermissionsFromStorage = (): string[] => {
    try {
      const storedPermissions = localStorage.getItem('vue-base-permissions');
      if (storedPermissions) {
        const parsed = JSON.parse(storedPermissions);
        if (Array.isArray(parsed) && parsed.length > 0) {
          return parsed;
        }
      }
    } catch (error) {
      // 从 localStorage 读取权限失败，使用后备方案
    }
    
    // 后备方案：从 userProfile 中获取
    if (userProfile.value?.permissions) {
      return userProfile.value.permissions || [];
    }
    
    return [];
  };
  
  // 初始化权限数据
  permissionsRef.value = readPermissionsFromStorage();
  
  // 监听 localStorage 的 storage 事件（当其他标签页或窗口修改 localStorage 时触发）
  if (typeof window !== 'undefined') {
    window.addEventListener('storage', (e) => {
      if (e.key === 'vue-base-permissions') {
        permissionsRef.value = readPermissionsFromStorage();
      }
    });
  }
  
  // 计算属性：获取当前Token
  const getCurrentToken = computed(() => {
    return TokenManager.getAuthToken();
  });
  
  // 计算属性：当前用户角色
  const userRoles = computed(() => {
    if (!userProfile.value) return [];
    return userProfile.value.roles || [];
  });
  
  // 计算属性：判断用户是否有特定角色
  const hasRole = computed(() => {
    return (roleCode: string) => {
      if (!userProfile.value?.roles) return false;
      return userProfile.value.roles.includes(roleCode);
    };
  });
  
  // 计算属性：当前用户权限
  // 优先从 localStorage 读取（由 vue-base 的 permission store 管理）
  // 如果 localStorage 中没有，则从 userProfile 中获取（作为后备）
  const permissions = computed(() => {
    // 每次访问时重新读取，确保获取最新值
    const latestPermissions = readPermissionsFromStorage();
    // 如果读取到的权限与当前 ref 不同，更新 ref（触发响应式更新）
    if (JSON.stringify(latestPermissions) !== JSON.stringify(permissionsRef.value)) {
      permissionsRef.value = latestPermissions;
    }
    return permissionsRef.value;
  });
  
  // 监听 userProfile 的变化，同步更新权限
  watch(userProfile, () => {
    permissionsRef.value = readPermissionsFromStorage();
  }, { deep: true });
  
  // 计算属性：判断用户是否有特定权限
  const hasPermission = computed(() => {
    return (permission: string) => {
      if (!permission) return true;
      if (!permissions.value || permissions.value.length === 0) return false;
      // 支持超级管理员通配符
      return permissions.value.includes('*') || permissions.value.includes(permission);
    };
  });
  
  const refreshPermissions = () => {
    permissionsRef.value = readPermissionsFromStorage();
  };
  
  // 获取当前用户信息
  const getUserProfile = async () => {
    try {
      // 判断是否在qiankun子应用中
      if (qiankunWindow.__POWERED_BY_QIANKUN__) {
        // 从父应用获取用户信息
        const userInfo = await new Promise<any>((resolve) => {
          // qiankunWindow.requestUserInfo((data: any) => {
          //   resolve(data);
          // });
          // 直接从localStorage获取用户信息
          const userInfo = localStorage.getItem('userInfo');
          if (userInfo) {
            resolve(JSON.parse(userInfo));
          } else {
            resolve(null);
          }
        });
        
        userProfile.value = userInfo;
        // 获取用户信息后，刷新权限
        refreshPermissions();
        return userInfo;
      } else {
        // 独立运行时，从API获取用户信息
        const res = await http.get('/api/user/my-profile', {}, false, true);
        if (res && res.code === 200) {
          userProfile.value = res.data;
          // 获取用户信息后，刷新权限
          refreshPermissions();
          return res.data;
        }
        return null;
      }
    } catch (error) {
      console.error('获取用户信息失败:', error);
      return null;
    }
  };
  
  // 清除认证状态
  const clearAuth = () => {
    TokenManager.clearTokens();
    userProfile.value = null;
    permissionsRef.value = [];
  };
  
  return {
    userProfile,
    getCurrentToken,
    userRoles,
    hasRole,
    permissions,
    hasPermission,
    getUserProfile,
    refreshPermissions,
    clearAuth
  };
}); 